*P=&a[0] 和P=&a[0]有什么区别

来源:百度知道 编辑:UC知道 时间:2024/05/21 08:24:44
C语言里指针变量那块,我看到这个不太明白,它有个粒子是

int *p=&a[0];相当于int *p;p=&a[0];然后它特别强调是p=&[0]而不是*p=&a[0],我不太明白,她第一步是将指针变量P定义为整型变量,那第二步两个有什么区别呢??谢谢

举个例子吧:

a是一个数组,它在内存中的初始地址比如说是0x11111111(简单假设),且a[0]的值是1,也就是说,内存0x11111111中存储的值是1。

于是,&a[0]=0x11111111,a[0]=1。

int *p;
p=&a[0];

指针p会有一个自己的内存地址,通常占用4个字节(比如初始地址是0x22222222)。p的值是&a[0],也就是说从0x22222222开始,后面4个字节中存储的值是0x11111111。

*p的值就等于p所指向的内存地址中存储的值,也就是a[0]。所以*p等于1。

如果*p=&a[0]的话,很容易出问题。比如说int *p之后,p的初始值可能是0xCCCCCCCC(Debug版本)或者0x00000000(Release版本)。这个时候,如果你写一句*p=&a[0]的话,将会把0xCCCCCCCC或者0x00000000内存之后4个字节的值变为0x11111111。

而0xCCCCCCCC和0x00000000内存区通常是不可写的,这样就会报错。

因为前者把对p的声明和赋初值写在一起了.
C语言里某些类型,在声明变量时就赋初值,和声明了以后再赋值,有些不同.典型的就是数组(尤其是字符串更要注意).

呵呵 因为int *p=&a[0];是声明一个指针变量 其中P就是那个指针变量(这里的*表示类型 不是表示取值),所以说应该是p=&a[0];

如果是*p=&a[0]的话 表示 P指针所指向的区域的值是 &a[0],这个不符合题意的,